package lv.clientedisqueria.view.usuario;

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;

import lv.clientedisqueria.controller.Controller;
import lv.clientedisqueria.model.usuario.UsuarioModel;
import lv.clientedisqueria.view.AbstractPanel;
import lv.mensajeriadisqueria.idomain.IRol;
import lv.mensajeriadisqueria.idomain.IUsuario;

/**
 * Este es el panel de administracion de usuarios
 */
@SuppressWarnings("serial")
public class UsuarioPanel extends AbstractPanel<IUsuario> {

	private final Controller<IUsuario> controller;

	private JTextField nombreTF;
	private JLabel nombreLbl;
	private JComboBox rolCoB;
	private JLabel rolLbl;
	private JLabel descripcionLbl;
	private JTextField descripcionTF;
	private JLabel claveLbl;
	private JPasswordField clavePTF;
	private JPanel textFieldsPanel;
	private JScrollPane scrollPane;
	private JTable usuarioTabla;

	private DefaultComboBoxModel rolComboBoxModel;

	private final UsuarioModel usuarioModel;
	
	public UsuarioPanel(final UsuarioModel usuarioModel) {
		super(usuarioModel);
		this.usuarioModel = usuarioModel;
		controller = new Controller<IUsuario>(usuarioModel);
		controller.addObserver(this);
		iniciarView();
	}

	private void iniciarView() {
		setLayout(new BorderLayout());
		add(new UsuarioMenuBoton(controller), BorderLayout.NORTH);
		
		JPanel panel = new JPanel(new BorderLayout());
		panel.add(getTextFieldsPanel(), BorderLayout.NORTH);
		
		panel.add(getScrollPane(), BorderLayout.CENTER);
		add(panel, BorderLayout.CENTER);
	}

	public Controller<IUsuario> getUsuarioController() {
		return controller;
	}

	public JScrollPane getScrollPane() {
		if(scrollPane == null) {
			scrollPane = new JScrollPane(getUsuarioTabla());
			scrollPane.setAutoscrolls(true);
		}
		return scrollPane;
	}
	
	public JTable getUsuarioTabla() {
		if (usuarioTabla == null) {
			usuarioTabla = new JTable(controller.getModelo().getTablaModel());
			usuarioTabla.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			usuarioTabla.setSelectionModel(controller.getModelo().getTablaModel().getListSelectionModel());
		}
		return usuarioTabla;
	}
	
	public JTextField getNombreTF() {
		if(nombreTF == null) {
			nombreTF = new JTextField();
			nombreTF.setEnabled(false);
		}
		return nombreTF;
	}

	public JLabel getNombreLbl() {
		if(nombreLbl == null) {
			nombreLbl = new JLabel("Nombre");
		}
		return nombreLbl;
	}

	public JComboBox getRolCoB() {
		if(rolCoB == null){
			rolComboBoxModel = new DefaultComboBoxModel(usuarioModel.buscarRoles().toArray());
			rolComboBoxModel.setSelectedItem(((IUsuario)controller.getModelo()
					.getTablaModel().getSeleccionado()).getRol());
			rolCoB = new JComboBox(rolComboBoxModel);
			rolCoB.setEnabled(false);
		}
		return rolCoB;
	}

	public JLabel getRolLbl() {
		if(rolLbl == null){
			rolLbl = new JLabel("Rol");
		}
		return rolLbl;
	}

	public JLabel getDescripcionLbl() {
		if(descripcionLbl == null){
			descripcionLbl = new JLabel("Descripcion");
		}
		return descripcionLbl;
	}

	public JTextField getDescripcionTF() {
		if(descripcionTF == null){
			descripcionTF = new JTextField();
			descripcionTF.setEnabled(false);
		}
		return descripcionTF;
	}

	public JLabel getClaveLbl() {
		if(claveLbl == null) {
			claveLbl = new JLabel("Clave");
		}
		return claveLbl;
	}

	public JPasswordField getClavePTF() {
		if(clavePTF == null) {
			clavePTF = new JPasswordField();
			clavePTF.setEnabled(false);
		}
		return clavePTF;
	}

	public JPanel getTextFieldsPanel() {
		if(textFieldsPanel == null){
			textFieldsPanel = new JPanel(new GridLayout(4, 4));
			textFieldsPanel.add(getNombreLbl());
			textFieldsPanel.add(getNombreTF());
			textFieldsPanel.add(getClaveLbl());
			textFieldsPanel.add(getClavePTF());
			textFieldsPanel.add(getDescripcionLbl());
			textFieldsPanel.add(getDescripcionTF());
			textFieldsPanel.add(getRolLbl());
			textFieldsPanel.add(getRolCoB());
			textFieldsPanel.validate();
			
			IUsuario usuario = (IUsuario)controller.getModelo()
			.getTablaModel().getSeleccionado();

			if(usuario != null){
				actualizarCampos(usuario);
			}
		}
		return textFieldsPanel;
	}
	
	protected IUsuario actualizarDomain(IUsuario usuario) {
		usuario.setNombre(getNombreTF().getText());
		usuario.setClave(String.valueOf(getClavePTF().getPassword()));
		usuario.setDescripcion(getDescripcionTF().getText());
		usuario.setRol((IRol)rolComboBoxModel.getSelectedItem());
		return usuario;
	}

	protected void iniciarCampos() {
		clavePTF.setText("");
		descripcionTF.setText("");
		rolCoB.setSelectedIndex(0);
		nombreTF.setText("");
	}

	/**
	 * Habilita y dehabilita los text field dependiendo del parametro
	 * @param habilitar
	 */
	protected void habilitarTextField(boolean habilitar) {
		clavePTF.setEnabled(habilitar);
		descripcionTF.setEnabled(habilitar);
		rolCoB.setEnabled(habilitar);
		nombreTF.setEnabled(habilitar);
	}

	@Override
	protected void actualizarTabla() {
		usuarioTabla.updateUI();
	}

	@Override
	protected Controller<IUsuario> getController() {
		return this.controller;
	}

	@Override
	protected void actualizarCampos(IUsuario usuario) {
		getNombreTF().setText(usuario.getNombre());
		getDescripcionTF().setText(usuario.getDescripcion());
		getClavePTF().setText(usuario.getClave());
		rolComboBoxModel.setSelectedItem(usuario.getRol());
		UsuarioPanel.this.repaint();
	}
}